{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "LightGBM模型调优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "import lightgbm as lgbm\n",
    "from lightgbm.sklearn import LGBMClassifier\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>msno</th>\n",
       "      <th>song_id</th>\n",
       "      <th>source_system_tab</th>\n",
       "      <th>source_screen_name</th>\n",
       "      <th>source_type</th>\n",
       "      <th>target</th>\n",
       "      <th>city</th>\n",
       "      <th>bd</th>\n",
       "      <th>gender</th>\n",
       "      <th>registered_via</th>\n",
       "      <th>registration_init_time</th>\n",
       "      <th>expiration_date</th>\n",
       "      <th>song_length</th>\n",
       "      <th>genre_ids</th>\n",
       "      <th>artist_name</th>\n",
       "      <th>composer</th>\n",
       "      <th>lyricist</th>\n",
       "      <th>language</th>\n",
       "      <th>name</th>\n",
       "      <th>isrc</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>FGtllVqz18RPiwJj/edr2gV78zirAiY/9SmYvia+kCg=</td>\n",
       "      <td>BBzumQNXUHKdEBOB7mAJuzok+IJA1c2Ryg/yzTF6tik=</td>\n",
       "      <td>1</td>\n",
       "      <td>7</td>\n",
       "      <td>7</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>7</td>\n",
       "      <td>20120102</td>\n",
       "      <td>20171005</td>\n",
       "      <td>206471</td>\n",
       "      <td>183</td>\n",
       "      <td>469</td>\n",
       "      <td>1449</td>\n",
       "      <td>3032</td>\n",
       "      <td>52.0</td>\n",
       "      <td>1334</td>\n",
       "      <td>GBUM71602854</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>pouJqjNRmZOnRNzzMWWkamTKkIGHyvhl/jo4HgbncnM=</td>\n",
       "      <td>BBzumQNXUHKdEBOB7mAJuzok+IJA1c2Ryg/yzTF6tik=</td>\n",
       "      <td>0</td>\n",
       "      <td>11</td>\n",
       "      <td>7</td>\n",
       "      <td>0</td>\n",
       "      <td>15</td>\n",
       "      <td>18</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>20151220</td>\n",
       "      <td>20170930</td>\n",
       "      <td>206471</td>\n",
       "      <td>183</td>\n",
       "      <td>469</td>\n",
       "      <td>1449</td>\n",
       "      <td>3032</td>\n",
       "      <td>52.0</td>\n",
       "      <td>1334</td>\n",
       "      <td>GBUM71602854</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>xbodnNBaLMyqqI7uFJlvHOKMJaizuWo/BB/YHZICcKo=</td>\n",
       "      <td>BBzumQNXUHKdEBOB7mAJuzok+IJA1c2Ryg/yzTF6tik=</td>\n",
       "      <td>3</td>\n",
       "      <td>8</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>7</td>\n",
       "      <td>20120804</td>\n",
       "      <td>20171004</td>\n",
       "      <td>206471</td>\n",
       "      <td>183</td>\n",
       "      <td>469</td>\n",
       "      <td>1449</td>\n",
       "      <td>3032</td>\n",
       "      <td>52.0</td>\n",
       "      <td>1334</td>\n",
       "      <td>GBUM71602854</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>s0ndDsjI79amU0RBiullFN8HRz9HjE++34jGNa7zJ/s=</td>\n",
       "      <td>BBzumQNXUHKdEBOB7mAJuzok+IJA1c2Ryg/yzTF6tik=</td>\n",
       "      <td>3</td>\n",
       "      <td>8</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "      <td>20110808</td>\n",
       "      <td>20170917</td>\n",
       "      <td>206471</td>\n",
       "      <td>183</td>\n",
       "      <td>469</td>\n",
       "      <td>1449</td>\n",
       "      <td>3032</td>\n",
       "      <td>52.0</td>\n",
       "      <td>1334</td>\n",
       "      <td>GBUM71602854</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Vw4Umh6/qlsJDC/XMslyAxVvRgFJGHr53yb/nrmY1DU=</td>\n",
       "      <td>BBzumQNXUHKdEBOB7mAJuzok+IJA1c2Ryg/yzTF6tik=</td>\n",
       "      <td>3</td>\n",
       "      <td>8</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>33</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "      <td>20070323</td>\n",
       "      <td>20170915</td>\n",
       "      <td>206471</td>\n",
       "      <td>183</td>\n",
       "      <td>469</td>\n",
       "      <td>1449</td>\n",
       "      <td>3032</td>\n",
       "      <td>52.0</td>\n",
       "      <td>1334</td>\n",
       "      <td>GBUM71602854</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                           msno  \\\n",
       "0  FGtllVqz18RPiwJj/edr2gV78zirAiY/9SmYvia+kCg=   \n",
       "1  pouJqjNRmZOnRNzzMWWkamTKkIGHyvhl/jo4HgbncnM=   \n",
       "2  xbodnNBaLMyqqI7uFJlvHOKMJaizuWo/BB/YHZICcKo=   \n",
       "3  s0ndDsjI79amU0RBiullFN8HRz9HjE++34jGNa7zJ/s=   \n",
       "4  Vw4Umh6/qlsJDC/XMslyAxVvRgFJGHr53yb/nrmY1DU=   \n",
       "\n",
       "                                        song_id  source_system_tab  \\\n",
       "0  BBzumQNXUHKdEBOB7mAJuzok+IJA1c2Ryg/yzTF6tik=                  1   \n",
       "1  BBzumQNXUHKdEBOB7mAJuzok+IJA1c2Ryg/yzTF6tik=                  0   \n",
       "2  BBzumQNXUHKdEBOB7mAJuzok+IJA1c2Ryg/yzTF6tik=                  3   \n",
       "3  BBzumQNXUHKdEBOB7mAJuzok+IJA1c2Ryg/yzTF6tik=                  3   \n",
       "4  BBzumQNXUHKdEBOB7mAJuzok+IJA1c2Ryg/yzTF6tik=                  3   \n",
       "\n",
       "   source_screen_name  source_type  target  city  bd  gender  registered_via  \\\n",
       "0                   7            7       1     1   0       2               7   \n",
       "1                  11            7       0    15  18       1               4   \n",
       "2                   8            3       1     1   0       2               7   \n",
       "3                   8            3       1     5  21       0               9   \n",
       "4                   8            3       0     6  33       0               9   \n",
       "\n",
       "   registration_init_time  expiration_date  song_length  genre_ids  \\\n",
       "0                20120102         20171005       206471        183   \n",
       "1                20151220         20170930       206471        183   \n",
       "2                20120804         20171004       206471        183   \n",
       "3                20110808         20170917       206471        183   \n",
       "4                20070323         20170915       206471        183   \n",
       "\n",
       "   artist_name  composer  lyricist  language  name          isrc  \n",
       "0          469      1449      3032      52.0  1334  GBUM71602854  \n",
       "1          469      1449      3032      52.0  1334  GBUM71602854  \n",
       "2          469      1449      3032      52.0  1334  GBUM71602854  \n",
       "3          469      1449      3032      52.0  1334  GBUM71602854  \n",
       "4          469      1449      3032      52.0  1334  GBUM71602854  "
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath + \"FE_train.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = train['target'] \n",
    "X_train = train.drop([\"msno\",\"song_id\", \"target\",\"isrc\"], axis=1)\n",
    "\n",
    "#保存特征名字以备后用（可视化）\n",
    "feat_names = X_train.columns "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "MAX_ROUNDS = 20000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "#直接调用lightgbm内嵌的交叉验证(cv)，可对连续的n_estimators参数进行快速交叉验证\n",
    "#而GridSearchCV只能对有限个参数进行交叉验证，且速度相对较慢\n",
    "def get_n_estimators(params , X_train , y_train , early_stopping_rounds=10):\n",
    "    X_train.head()\n",
    "    y_train.head()\n",
    "    lgbm_params = params.copy()\n",
    "    print(\"lgbm_params=\",lgbm_params)\n",
    "    lgbmtrain = lgbm.Dataset(X_train , y_train )\n",
    "     \n",
    "    #num_boost_round为弱分类器数目，下面的代码参数里因为已经设置了early_stopping_rounds\n",
    "    #即性能未提升的次数超过过早停止设置的数值，则停止训练\n",
    "    cv_result = lgbm.cv(lgbm_params , lgbmtrain , num_boost_round=MAX_ROUNDS , nfold=5,  metrics='auc' , early_stopping_rounds=early_stopping_rounds,seed=3 )\n",
    "     \n",
    "    print('best n_estimators:' , len(cv_result['auc-mean']))\n",
    "    print('best cv score:' , cv_result['auc-mean'][-1])\n",
    "     \n",
    "    return len(cv_result['auc-mean'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>msno</th>\n",
       "      <th>song_id</th>\n",
       "      <th>source_system_tab</th>\n",
       "      <th>source_screen_name</th>\n",
       "      <th>source_type</th>\n",
       "      <th>target</th>\n",
       "      <th>city</th>\n",
       "      <th>bd</th>\n",
       "      <th>gender</th>\n",
       "      <th>registered_via</th>\n",
       "      <th>registration_init_time</th>\n",
       "      <th>expiration_date</th>\n",
       "      <th>song_length</th>\n",
       "      <th>genre_ids</th>\n",
       "      <th>artist_name</th>\n",
       "      <th>composer</th>\n",
       "      <th>lyricist</th>\n",
       "      <th>language</th>\n",
       "      <th>name</th>\n",
       "      <th>isrc</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>FGtllVqz18RPiwJj/edr2gV78zirAiY/9SmYvia+kCg=</td>\n",
       "      <td>BBzumQNXUHKdEBOB7mAJuzok+IJA1c2Ryg/yzTF6tik=</td>\n",
       "      <td>1</td>\n",
       "      <td>7</td>\n",
       "      <td>7</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>7</td>\n",
       "      <td>20120102</td>\n",
       "      <td>20171005</td>\n",
       "      <td>206471</td>\n",
       "      <td>183</td>\n",
       "      <td>469</td>\n",
       "      <td>1449</td>\n",
       "      <td>3032</td>\n",
       "      <td>52.0</td>\n",
       "      <td>1334</td>\n",
       "      <td>GBUM71602854</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>pouJqjNRmZOnRNzzMWWkamTKkIGHyvhl/jo4HgbncnM=</td>\n",
       "      <td>BBzumQNXUHKdEBOB7mAJuzok+IJA1c2Ryg/yzTF6tik=</td>\n",
       "      <td>0</td>\n",
       "      <td>11</td>\n",
       "      <td>7</td>\n",
       "      <td>0</td>\n",
       "      <td>15</td>\n",
       "      <td>18</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>20151220</td>\n",
       "      <td>20170930</td>\n",
       "      <td>206471</td>\n",
       "      <td>183</td>\n",
       "      <td>469</td>\n",
       "      <td>1449</td>\n",
       "      <td>3032</td>\n",
       "      <td>52.0</td>\n",
       "      <td>1334</td>\n",
       "      <td>GBUM71602854</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                           msno  \\\n",
       "0  FGtllVqz18RPiwJj/edr2gV78zirAiY/9SmYvia+kCg=   \n",
       "1  pouJqjNRmZOnRNzzMWWkamTKkIGHyvhl/jo4HgbncnM=   \n",
       "\n",
       "                                        song_id  source_system_tab  \\\n",
       "0  BBzumQNXUHKdEBOB7mAJuzok+IJA1c2Ryg/yzTF6tik=                  1   \n",
       "1  BBzumQNXUHKdEBOB7mAJuzok+IJA1c2Ryg/yzTF6tik=                  0   \n",
       "\n",
       "   source_screen_name  source_type  target  city  bd  gender  registered_via  \\\n",
       "0                   7            7       1     1   0       2               7   \n",
       "1                  11            7       0    15  18       1               4   \n",
       "\n",
       "   registration_init_time  expiration_date  song_length  genre_ids  \\\n",
       "0                20120102         20171005       206471        183   \n",
       "1                20151220         20170930       206471        183   \n",
       "\n",
       "   artist_name  composer  lyricist  language  name          isrc  \n",
       "0          469      1449      3032      52.0  1334  GBUM71602854  \n",
       "1          469      1449      3032      52.0  1334  GBUM71602854  "
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.head(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "LightGBM的主要的超参包括：\n",
    "1. 树的数目n_estimators 和 学习率 learning_rate\n",
    "2. 树的最大深度max_depth 和 树的最大叶子节点数目num_leaves（LightGBM采用叶子优先的方式生成树，num_leaves很重要，设置成比 2^max_depth 小）\n",
    "3. 叶子结点的最小样本数:min_data_in_leaf(min_data, min_child_samples)\n",
    "4. 每棵树的列采样比例：feature_fraction/colsample_bytree\n",
    "5. 每棵树的行采样比例：bagging_fraction （需同时设置bagging_freq=1）/subsample\n",
    "6. 正则化参数lambda_l1(reg_alpha), lambda_l2(reg_lambda)\n",
    "\n",
    "7. 两个非模型复杂度参数，但会影响模型速度和精度。可根据特征取值范围和样本数目修改这两个参数\n",
    "1）特征的最大bin数目max_bin：默认255；\n",
    "2）用来建立直方图的样本数目subsample_for_bin：默认200000。\n",
    "\n",
    "对n_estimators，用LightGBM内嵌的cv函数调优，因为同XGBoost一样，LightGBM学习的过程内嵌了cv，速度极快。\n",
    "其他参数用GridSearchCV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "lgbm_params= {'boosting_type': 'goss', 'objective': 'binary', 'is_unbalance': True, 'categorical_feature': [0, 1, 2, 6, 11, 12, 13, 14, 16], 'n_jobs': 4, 'learning_rate': 0.1, 'num_leaves': 60, 'max_depth': 6, 'colsample_bytree': 0.7, 'verbosity': 5}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\Anaconda3\\lib\\site-packages\\lightgbm\\basic.py:842: UserWarning: categorical_feature keyword has been found in `params` and will be ignored.\n",
      "Please use categorical_feature argument of the Dataset constructor to pass this parameter.\n",
      "  .format(key))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best n_estimators: 291\n",
      "best cv score: 0.6924660697340392\n"
     ]
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          #'source_system_tab'0,'source_screen_name1','source_type2','gender6','genre_ids11','artist_name12','composer13','lyricist14','name16'\n",
    "           'categorical_feature': [0,1,2,6,11,12,13,14,16],\n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          #'n_estimators':n_estimators_1,\n",
    "          'num_leaves': 60,\n",
    "          'max_depth': 6,\n",
    "          'colsample_bytree': 0.7,\n",
    "          'verbosity':5\n",
    "         }\n",
    "\n",
    "n_estimators_1 = get_n_estimators(params, X_train , y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "best n_estimators: 196\n",
    "best cv score: 0.6934439025684936\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 3 candidates, totalling 15 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Using backend LokyBackend with 4 concurrent workers.\n",
      "[Parallel(n_jobs=4)]: Done  12 out of  15 | elapsed: 20.5min remaining:  5.1min\n",
      "[Parallel(n_jobs=4)]: Done  15 out of  15 | elapsed: 24.5min finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=3, shuffle=True),\n",
       "             error_score='raise-deprecating',\n",
       "             estimator=LGBMClassifier(boosting_type='goss',\n",
       "                                      categorical_feature=[0, 1, 2, 6, 11, 12,\n",
       "                                                           13, 14, 16],\n",
       "                                      class_weight=None, colsample_bytree=0.7,\n",
       "                                      importance_type='split',\n",
       "                                      is_unbalance=True, learning_rate=0.1,\n",
       "                                      max_depth=6, min_child_samples=20,\n",
       "                                      min_child_weight=0.001,\n",
       "                                      min_split_gain=0.0, n_estimators=291,\n",
       "                                      n_jobs=4, num_leaves=31,\n",
       "                                      objective='binary', random_state=None,\n",
       "                                      reg_alpha=0.0, reg_lambda=0.0,\n",
       "                                      silent=False, subsample=1.0,\n",
       "                                      subsample_for_bin=200000,\n",
       "                                      subsample_freq=0),\n",
       "             iid='warn', n_jobs=4, param_grid={'num_leaves': range(30, 60, 10)},\n",
       "             pre_dispatch='2*n_jobs', refit=False, return_train_score=False,\n",
       "             scoring='roc_auc', verbose=5)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#num_leaves\n",
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'categorical_feature': [0,1,2,6,11,12,13,14,16],\n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_1,\n",
    "          #'num_leaves': 60,\n",
    "          'max_depth': 6,\n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "num_leaves_s = range(30,60,10) #40,50,60,70,80\n",
    "tuned_parameters = dict( num_leaves = num_leaves_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=4, param_grid=tuned_parameters, cv = kfold, scoring=\"roc_auc\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6924960347224025\n",
      "{'num_leaves': 40}\n"
     ]
    }
   ],
   "source": [
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "n_leafs = len(num_leaves_s)\n",
    "x_axis = num_leaves_s\n",
    "plt.plot(x_axis, test_means)\n",
    "plt.xlabel( 'num_leaves' )\n",
    "plt.ylabel( 'AUC' )\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.69197936, 0.69249603, 0.69231491])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_means"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 4 candidates, totalling 20 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Using backend LokyBackend with 4 concurrent workers.\n",
      "[Parallel(n_jobs=4)]: Done  10 tasks      | elapsed: 19.8min\n",
      "[Parallel(n_jobs=4)]: Done  18 out of  20 | elapsed: 31.8min remaining:  3.5min\n",
      "[Parallel(n_jobs=4)]: Done  20 out of  20 | elapsed: 32.6min finished\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6924960347224025\n",
      "{'min_child_samples': 20}\n"
     ]
    }
   ],
   "source": [
    "#min_child_samples\n",
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'categorical_feature': [0,1,2,6,11,12,13,14,16],\n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_1,\n",
    "          'num_leaves': 40,\n",
    "          'max_depth': 6,\n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "min_child_samples_s = range(10,50,10) \n",
    "tuned_parameters = dict( min_child_samples = min_child_samples_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=4,  param_grid=tuned_parameters, cv = kfold, scoring=\"roc_auc\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)\n",
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "x_axis = min_child_samples_s\n",
    "plt.plot(x_axis, test_means)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 7 candidates, totalling 35 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Using backend LokyBackend with 4 concurrent workers.\n",
      "[Parallel(n_jobs=4)]: Done  10 tasks      | elapsed: 17.2min\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7004804685759104\n",
      "{'colsample_bytree': 0.4}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done  35 out of  35 | elapsed: 51.9min finished\n"
     ]
    }
   ],
   "source": [
    "#列采样\n",
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'categorical_feature': [0,1,2,6,11,12,13,14,16],\n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_1,\n",
    "          'num_leaves': 40,\n",
    "          'max_depth': 6,\n",
    "          'min_child_samples':20\n",
    "          #'colsample_bytree': 0.7,\n",
    "         }\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "colsample_bytree_s = [i/10.0 for i in range(3,10)]\n",
    "tuned_parameters = dict( colsample_bytree = colsample_bytree_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=4,  param_grid=tuned_parameters, cv = kfold, scoring=\"roc_auc\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)\n",
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD4CAYAAADlwTGnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3deXyU5b338c8vC4QACYSEBEhCwk6iLJJEWWRxQdCKdcOkdWuLHLuebp6jT3ue08ceT9vT7Xispy0irV0EcalalwJ1QUAQAoKQIIsJkLCEJewBsl3PHxltiIFM1nsm832/Xnm9Jtdc98zv4g7znfu+5r7GnHOIiEjoCfO6ABER8YYCQEQkRCkARERClAJARCREKQBEREJUhNcFNEd8fLxLS0vzugwRkaCyfv36w865hIbtQRUAaWlp5Ofne12GiEhQMbPdjbXrFJCISIhSAIiIhCgFgIhIiFIAiIiEKAWAiEiIUgCIiIQoBYCISIhSAASR42eqePq9PZSUV3hdioh0AkF1IVioKimv4MmVxSzOL6GisobrMhP57V1ZXpclIkFOARDA1u8+yvwVRSwpOECYGbNG96eq1vH65v0cPHmWvj2jvC5RRIKYAiDA1NQ6lhQc4IkVRby/5xgxURH805TB3DM+jaTYKHYePMVfN+3jufWlfGXqEK/LFZEgpgAIEKfOVbN4XQm/e7eYkvIzpMZF8/9mZXLbuGS6d/3HbhrStwc5aXE8s66E+ycPJizMPKxaRIKZAsBj+4+f4ferdvH02j2cPFtN1sDefO/6DK7NSCT8Ai/uuTkpfHvxJtYUHWHCkPgOrlhEOgsFgEe27D3OEyuKePWD/dQ6x8xL+zFnUjpjU3s3ue31l/bjBy8XsHBdiQJARFpMAdCBamsdb354kPkri1hTVE6PrhHcMyGNeyekkRIX7ffjREWGc/PYASxcW0L56Uriundpx6pFpLNSAHSAM5U1PL+hlAUriyk6fJr+sVF87/qR3JGTQkxUZIseMzcnladW7+aFDaXMuXJQG1csIqHArwAwsxnAo0A4MN859+MG9/8SmOb7NRro65zr5bvvHuD7vvv+wzn3lK99HPB7oBvwGvDPzjnXqtEEmIMnz/LH1bv505rdHK2oYlRyLP+TN5aZlyQRGd66a/BG9othdEovFq0r4UuT0jHTZLCINE+TAWBm4cDjwLVAKbDOzF52zhV+3Mc59616/b8OjPXdjgP+HcgCHLDet+1R4NfAXGANdQEwA3i9jcblqW0HTvLkyiJefH8fVbW1XDMykTmT0slJj2vTF+q87BQefGEz63cfJSstrs0eV0RCgz9HADnATudcEYCZLQJuAgov0D+Puhd9gOuAZc65ct+2y4AZZvY2EOOcW+1r/wPwWYI4AJxzrNhxmPkri3ln+yGiIsO4IzuFL0xMY1BCj3Z5zhtH9+eHrxSycG2JAkBEms2fABgAlNT7vRS4vLGOZjYQSAfevMi2A3w/pY20N/aYc6k7UiA1NdWPcjvWueoaXtq4jydXFLOt7CQJPbvywHXD+VxOKr3beXK2e9cIZo3pz1/e38v/vTGD2G4tm08QkdDkTwA0ds7iQufqc4HnnHM1TWzr92M65+YB8wCysrICZo7g6OlK/vzebp5avZtDJ88xIqknP71tFLPG9KdrRHiH1ZGbncrCtSW8vHEvd41P67DnFZHg508AlAIp9X5PBvZdoG8u8NUG205tsO3bvvZkPx8zoBQdOsWCVcU8t76Us1W1TBmWwJzZ6UwaEu/JROyo5FhG9oth4doS7rxioCaDRcRv/gTAOmComaUDe6l7kf9cw05mNhzoDayu17wE+E8z+/jqpunAQ865cjM7aWZXAO8BdwOPtXwY7cs5x3vF5cxfUcwbH5YRGRbGzWMH8KUr0xmW2NPT2syMvJwU/u9LBWzee5xRyb08rUdEgkeTAeCcqzazr1H3Yh4OLHDOFZjZw0C+c+5lX9c8YFH9j3L6Xuh/SF2IADz88YQw8GX+8THQ1wnACeCqmlpe27yf+SuK2bz3OL2jI/n6tCHcNT6NhJ5dvS7vEzeNGcB/vraVhWtLFAAi4jcLpo/eZ2Vlufz8/HZ/nhNnq1i0dg+/X7WLfcfPMiihO1+alM6tlyUTFdlx5/eb49uLN7JkywHWfu+a8xaPExExs/XOuU99iYheKeopKa/gd6t28cy6PZyurGH8oD788LOXMG1434BfdTMvJ5UXNuzllQ/2cUd24H1aSkQCjwIAeH/PUeavKOb1LfsJM+Mzo/ox58pBXDIg1uvS/JY1sDdD+vZg4doSBYCI+CVkA6Cm1rGs8ADzVxSTv/soPaMiuG/yIO6dkEa/2G5el9dsZkZudgr/8epWPjxwghFJMV6XJCIBLuQC4PS5ap7NL2HBql3sKa8gJa4b/35jBrOzUoL+3PktlyXzX3/bxqK1JfxgVqbX5YhIgAvuV7xmOHD8LE+t3sWf1+zmxNlqLkvtxUMzRzA9M+mCX7wSbOK6d2F6ZiIvbCjlwZkjAnbCWkQCQ0gEwA9eLuBPa3ZT6xwzLkniS5MGMW5g01+8EozyclJ55YP9vL5lPzePTW56AxEJWSERAHHdu3DX+IF8cWJ6s754JRiNH9SH1LhoFq4tUQCIyEWFRAB84+qhXpfQYcLCjDuyU/jpkm18dOgUg9tpJVIRCX6t+1YSCUi3j0smPMx4Zl1J051FJGQpADqhvjFRXD2iL8+vL6WyutbrckQkQCkAOqm8nFSOnK5kWWGZ16WISIBSAHRSk4cl0D82ikXr9nhdiogEKAVAJxUeZtyelcKKHYcpKa/wuhwRCUAKgE5sdnYKZmgyWEQapQDoxAb06saUYQk8u76E6hpNBovI+RQAnVxudiplJ87x1rZDXpciIgFGAdDJXT2yL/E9urJorSaDReR8CoBOLjI8jNuzknlr20H2Hz/jdTkiEkAUACEgNzuFWgfP5pd6XYqIBBAFQAgY2Kc7Ewb34Zl1JdTWBs93QItI+1IAhIjcnFT2HjvDip2HvS5FRAKEAiBEXJeZSO/oSE0Gi8gnFAAhomtEOLdclsyywjIOnTzndTkiEgAUACEkLyeF6lrH8xs0GSwiCoCQMqRvT7IG9uaZdSU4p8lgkVCnAAgxeTmpFB8+zZqicq9LERGPKQBCzPWX9qNnVISWiRYRBUCo6dYlnJvHDuD1LQc4VlHpdTki4iEFQAjKzU6lsrqWFzbs9boUEfGQAiAEZfSPYXRyLIvW7dFksEgIUwCEqNycVLaXnWLDnmNelyIiHlEAhKgbR/cnuku4rgwWCWEKgBDVo2sEs0b355UP9nPybJXX5YiIBxQAISw3J5UzVTW8tHGf16WIiAf8CgAzm2Fm28xsp5k9eIE+s82s0MwKzOzpeu0/MbMtvp876rVfbWYbzGyjma00syGtH440x+jkWEYk9dQ1ASIhqskAMLNw4HFgJpAB5JlZRoM+Q4GHgInOuUzgm772G4DLgDHA5cADZhbj2+zXwOedc2OAp4Hvt8mIxG9mRl5OKlv2nmDL3uNelyMiHcyfI4AcYKdzrsg5VwksAm5q0Oc+4HHn3FEA59xBX3sGsNw5V+2cOw1sAmb47nPAx2EQC+g8hAc+O2YAXSPCWKjJYJGQ408ADABK6v1e6murbxgwzMxWmdkaM/v4RX4TMNPMos0sHpgGpPjumwO8ZmalwF3Ajxt7cjOba2b5ZpZ/6NAh/0YlfouNjuSGS/vx0sZ9VFRWe12OiHQgfwLAGmlrePVQBDAUmArkAfPNrJdzbinwGvAusBBYDXz8KvMt4HrnXDLwO+AXjT25c26ecy7LOZeVkJDgR7nSXLk5qZw6V80rH+z3uhQR6UD+BEAp/3jXDpDMp0/XlAIvOeeqnHPFwDbqAgHn3CPOuTHOuWupC5MdZpYAjHbOvefb/hlgQivGIa2QndabwQnddU2ASIjxJwDWAUPNLN3MugC5wMsN+rxI3ekdfKd6hgFFZhZuZn187aOAUcBS4CgQa2bDfNtfC2xt7WCkZcyM3OxUNuw5xvayk16XIyIdpMkAcM5VA18DllD3Ir3YOVdgZg+b2SxftyXAETMrBN4CHnDOHQEigRW+9nnAnb4J4WrqJo6fN7NN1M0BPNDWgxP/3XLZACLDTZPBIiHEgmkxsKysLJefn+91GZ3WV5/ewKqdh1nz0NVERYZ7XY6ItBEzW++cy2rYriuB5RN52akcq6hiScEBr0sRkQ6gAJBPTBjch5S4bjoNJBIiFADyibCwusngNUXlFB8+7XU5ItLOFAByntvHJRMeZlofSCQEKADkPH1jorhqRF+eX19KZXWt1+WISDtSAMin5OWkcPhUJW9sLfO6FBFpRwoA+ZQpw/rSLzaKhetKmu4sIkFLASCfEh5m3J6Vwoodhygpr/C6HBFpJwoAadTsrGQAns3XUYBIZ6UAkEYl945m8tAEFueXUl2jyWCRzkgBIBeUl5PCgRNnWb5d38Mg0hkpAOSCrh6ZSHyPrixcq9NAIp2RAkAuKDI8jNvGJfPWtoOUnTjrdTki0sYUAHJRudkp1NQ6TQaLdEIKALmotPjujB/Uh2fyS6itDZ6lw0WkaQoAaVJuTgol5WdY9dFhr0sRkTakAJAmXZeZRK/oSBZpMlikU1EASJOiIsO5ZWwySwsPcOTUOa/LEZE2ogAQv+TlpFBV43h+Q6nXpYhIG1EAiF+GJvZk3MDeLFpXQjB9j7SIXJgCQPyWm51C0aHTrC0u97oUEWkDCgDx2w2j+tGzawSLtEy0SKegABC/RXeJ4Kax/Xlt836OV1R5XY6ItJICQJolNzuVc9W1/OV9TQaLBDsFgDTLJQNiuXRArCaDRToBBYA0W25OCh8eOMnGkmNelyIiraAAkGabNbo/3SLDdWWwSJBTAEiz9YyK5MbR/fjrB/s4da7a63JEpIUUANIiuTmpVFTW8PLGfV6XIiItpACQFhmb0ovhiT1ZtG6P16WISAspAKRFzIzcnBQ+KD1Owb7jXpcjIi2gAJAWu3nsALpEhGkyWCRIKQCkxXpFd+H6S5J4ceNezlTWeF2OiDSTAkBaJTcnlZNnq3l1836vSxGRZlIASKtcnh7HoPjuLFqryWCRYONXAJjZDDPbZmY7zezBC/SZbWaFZlZgZk/Xa/+JmW3x/dxRr93M7BEz225mW83sG60fjnQ0M+OO7BTydx9lR9lJr8sRkWZoMgDMLBx4HJgJZAB5ZpbRoM9Q4CFgonMuE/imr/0G4DJgDHA58ICZxfg2uxdIAUY450YCi9piQNLxbh2XTGS4aZlokSDjzxFADrDTOVfknKuk7oX6pgZ97gMed84dBXDOHfS1ZwDLnXPVzrnTwCZghu++LwMPO+dqG2wjQSa+R1euzUjkhQ2lnKvWZLBIsPAnAAYA9d/alfra6hsGDDOzVWa2xsw+fpHfBMw0s2gziwemUfeuH2AwcIeZ5ZvZ676jiE8xs7m+PvmHDh3yd1zSwXKzUzlaUcWSgjKvSxERP/kTANZIW8N1gCOAocBUIA+Yb2a9nHNLgdeAd4GFwGrg48VjugJnnXNZwBPAgsae3Dk3zzmX5ZzLSkhI8KNc8cKkIfEk9+6myWCRIOJPAJTyj3ftAMlAwwVgSoGXnHNVzrliYBt1gYBz7hHn3Bjn3LXUhcmOets877v9F2BUy4YggSAszLgjK4V3PzrC7iOnvS5HRPzgTwCsA4aaWbqZdQFygZcb9HmRutM7+E71DAOKzCzczPr42kdR9yK/tN42V/luTwG2t2Yg4r3bs1IIMzQZLBIkmgwA51w18DVgCbAVWOycKzCzh81slq/bEuCImRUCbwEPOOeOAJHACl/7POBO3+MB/Bi41cw2Az8C5rTlwKTjJcVGcdWIvjybX0pVTa3X5YhIEyyYvtYvKyvL5efne12GXMTfC8uY84d8fnPnOGZckuR1OSICmNl633zreXQlsLSpqcMTSIzpqmWiRYKAAkDaVER4GLOzUli+/RB7j53xuhwRuQgFgLS52Vl1HxpbrMlgkYCmAJA2lxIXzaQh8TybX0JNbfDMMYmEGgWAtIu8nFT2HT/LO9t19bZIoFIASLu4ZmQifbp3YaGuDBYJWAoAaRddIsK4bVwyb3x4kIMnznpdjog0QgEg7eaO7BRqah3Pri/1uhQRaYQCQNrNoIQeXJ4exzPrSqjVZLBIwFEASLvKy0llT3kFq4uOeF2KiDSgAJB2NeOSJGK7RWoyWCQAKQCkXUVFhnPz2AEsLSij/HSl1+WISD0KAGl3eTmpVNbU8sIGTQaLBBIFgLS74Uk9GZvai4Vr9xBMq8+KdHYKAOkQedmpfHToNPm7j3pdioj4KACkQ3xmdD96dI3QZLBIAFEASIeI7hLBrDH9eW3zfo6fqfK6HBFBASAdKC87lbNVtby0ca/XpYgICgDpQJcmx5LZP4aFa0s0GSwSABQA0qFyc1LZuv8EH5Qe97oUkZCnAJAOddOY/nSLDNd3BosEAAWAdKiYqEhuGNWPlzfu4/S5aq/LEQlpCgDpcHk5KZyurOGvm/Z5XYpISFMASIe7LLU3Q/v2YKG+NF7EUwoA6XBmRm5OKptKjvH4Wzs5V13jdUkiIUkBIJ7IzU5hekYiP12yjRn/vYK3tx30uiSRkKMAEE907xrBvLuz+P0XsjHg3t+tY85T+ew5UuF1aSIhQwEgnpo6vC9/++ZkHpw5gnc/Osw1v1zOL5Zu40ylTguJtDcFgHiuS0QY908ZzJvfmcrMS5L4nzd3cs0vlvPa5v26YlikHSkAJGAkxUbxaO5YFv/TeHpGRfCVP2/gziffY0fZSa9LE+mUFAAScHLS43jl65N4+KZMNpceZ+ajK/jhK4WcOKtVREXakgJAAlJEeBh3j0/jre9O5fasZBasKuaqny3nufWl1NbqtJBIW1AASEDr06MrP7plFC99dSIpcd347rObuO0377JlrxaTE2ktBYAEhVHJvXj+/gn89LZR7Cmv4MZfreShFzZTfrrS69JEgpYCQIJGWJhxe1YKb353Kl+cmM7i/BKm/ext/rh6FzU6LSTSbH4FgJnNMLNtZrbTzB68QJ/ZZlZoZgVm9nS99p+Y2Rbfzx2NbPeYmZ1q+RAk1MRERfJvn8ng9X++ksz+MfzbSwXc+NhK1u0q97o0kaDSZACYWTjwODATyADyzCyjQZ+hwEPAROdcJvBNX/sNwGXAGOBy4AEzi6m3XRbQq22GIqFmWGJP/jzncv7385dxrKKS23+zmm89s5GDJ856XZpIUPDnCCAH2OmcK3LOVQKLgJsa9LkPeNw5dxTAOffxwi4ZwHLnXLVz7jSwCZgBnwTLT4F/af0wJFSZGddf2o+/f2cKX79qCK9u3s+0n73Nb5d/RGV1rdfliQQ0fwJgAFB/3d5SX1t9w4BhZrbKzNaY2Qxf+yZgpplFm1k8MA1I8d33NeBl59z+iz25mc01s3wzyz906JAf5Uooiu4SwXemD2fZtyYzfnAffvT6h8x49B3e2a6/GZEL8ScArJG2hjNuEcBQYCqQB8w3s17OuaXAa8C7wEJgNVBtZv2B24HHmnpy59w851yWcy4rISHBj3IllA3s053592Tzuy9k4xzcvWAtc/+QT0m5FpkTacifACjlH+/aAZKBhl/lVAq85Jyrcs4VA9uoCwScc48458Y4566lLkx2AGOBIcBOM9sFRJvZzlaNRKSeacP78rdvXsm/zBjOyp2HueYXy/nlsu2crdIicyIf8ycA1gFDzSzdzLoAucDLDfq8SN3pHXyneoYBRWYWbmZ9fO2jgFHAUufcq865JOdcmnMuDahwzg1pmyGJ1OkaEc5Xpg7hje9MYXpmEo++sYOrf76cv205oEXmRPAjAJxz1dSdr18CbAUWO+cKzOxhM5vl67YEOGJmhcBbwAPOuSNAJLDC1z4PuNP3eCIdpl9sNx7LG8uiuVfQMyqC+/+0nrsXrGXnQX36WEKbBdM7oaysLJefn+91GRLEqmtq+dOa3fxi2XYqKmv44qR0vn7VEHpGRXpdmki7MbP1zrmshu26ElhCSkR4GPdOTOet707ltnHJPLGiiKt+vpy/vF+q00ISchQAEpL69OjKj28dxYtfmUj/Xt341jObuP03q7XInIQUBYCEtNEpvfjLlyfwX7eOovjwaWb9aiXff3EzR7XInIQABYCEvLAwY3Z23SJzd49PY+HaEqb9/G3+tGa3FpmTTk0BIOIT2y2SH8zK5NVvTGJEUk++/+IWZv1qJet3a5E56ZwUACINjEiKYeF9V/BY3ljKT1dy669X8+3FGzl4UovMSeeiABBphJlx4+j+vPGdKXx12mBe2bSfq362nPkriqiq0SJz0jkoAEQuIrpLBA9cN4Kl35pMTnoc//HqVmY+uoKVOw57XZpIqykARPyQFt+dBfdm8+Q9WVTV1HLnk+/x5T+tp/SoFpmT4BXhdQEiweTqkYlMHBLPkyuL+dWbO3lr20G+PGUI/zRlEFGR4V6XJ9IsWgpCpIX2HTvDI69t5dUP9tO3Z1dmXJLEdZlJ5KTHERmug2sJHBdaCkIBINJK7350mKfe3cXy7Yc4W1VLbLdIrh7Rl+mZiUwelkB0Fx1oi7cuFAD6yxRppQmD45kwOJ4zlTWs2HGIJQVlvPFhGS+8v5euEWFcOTSB6ZmJXDMykbjuXbwuV+QTCgCRNtKtSzjTM5OYnplEdU0t63YdZUnBAZYVlvH3rWWEGWSnxXFdZhLXZiSSEhftdckS4nQKSKSdOeco2HeCpQUHWFJQxraykwBk9o9hekYS112SyPDEnpg19u2rIq2nOQCRALHr8GmWFh5gaUEZ6/ccxTlIjYvmusxEpmcmcVlqb8LDFAbSdhQAIgHo4MmzvLH1IEsKDvDuziNU1tQS36ML14xMZHpmIhMGx+vjpdJqCgCRAHfybBXLt9dNIr/14UFOnaume5dwpg6v+0TRtBF9idE3l0kLKABEgsi56hpWf3SEpYVlLCss49DJc0SGG+MHxzM9I5FrMxJJjInyukwJEgoAkSBVW+t4v+SYbxL5ALuO1C0/MTa1V90kcmYigxJ6eFylBDIFgEgn4Jxjx8FTn3yiaLPvKyyH9O1RN4mckcSo5Fh9okjOowAQ6YT2HTvDssIylhQc4L3icmpqHUkxUUz3hcHlg7QshSgARDq9YxWVvLH1IEsLD3yyLEVMVARXj0zkOi1LEdIUACIhpOGyFMcqqnzLUsQzPTNJy1KEGK0FJBJCGi5LsXZXOUsLynzLUhz8ZFmK6ZlJTNeyFCFLRwAiIeRCy1Jk9IvhuswkpmcmMiJJy1J0NjoFJCKf0tiyFMMTe3Lf5EHMGt2fLhGaQO4MFAAiclEHT55lWWEZf3h3N9vKTpIY05UvTEznc5en6grkIKcAEBG/OOdYvv0QT6woYtXOI/ToGkFudgpfnJRO/17dvC5PWkABICLNtmXvcea9U8Srm/djwI2j+3PflYPI6B/jdWnSDAoAEWmx0qMVLFi5i0Xr9lBRWcOVQ+O578pBXDk0XhPGQUABICKtdryiij+v3c3vVu3i0MlzjOwXw9zJ6XxmVH9dcRzAFAAi0mbOVdfw0sZ9PPFOETsOnqJfbBRfnJhObk4KPTVhHHAUACLS5mprHW9vP8i8d4pYU1ROz64RfO7yVL4wMZ2kWC1XHSguFAB+HbOZ2Qwz22ZmO83swQv0mW1mhWZWYGZP12v/iZlt8f3cUa/9z77H3GJmC8xMbxtEgkxYmHHViEQWzR3Py1+byJThCTyxoohJP3mTby/eyIcHTnhdolxEk0cAZhYObAeuBUqBdUCec66wXp+hwGLgKufcUTPr65w7aGY3AN8EZgJdgeW+PifM7Hrgdd9DPA2845z79cVq0RGASOArKa/gyZXFPLOuhDNVNUwZlsDcyYOYMLiPJow90pojgBxgp3OuyDlXCSwCbmrQ5z7gcefcUQDn3EFfewaw3DlX7Zw7DWwCZvj6vOZ8gLVAcksGJiKBJSUumh/MymT1Q1fx3enDKNh3gs/Pf4/PPLaSlzbupaqm1usSxcefABgAlNT7vdTXVt8wYJiZrTKzNWY2w9e+CZhpZtFmFg9MA1Lqb+g79XMX8LeWDEBEAlOv6C587aqhrPzXafz4lks5U1XDPy/ayNSfvs2TK4s5da7a6xJDnj+rgTZ2zNbwvFEEMBSYSt07+RVmdolzbqmZZQPvAoeA1UDDvf6/1J3+WdHok5vNBeYCpKam+lGuiASSqMhwcnNSmZ2Vwpsf1k0Y//CVQh79+3Y+f8VA7p2Qpu839og/RwClnP+uPRnY10ifl5xzVc65YmAbdYGAc+4R59wY59y11IXJjo83MrN/BxKAb1/oyZ1z85xzWc65rISEBH/GJCIBKCzMuCYjkcX3j+cvX5nApKHx/Hb5R0z6yZs88OwmdvhWJpWO488RwDpgqJmlA3uBXOBzDfq8COQBv/ed6hkGFPkmkHs5546Y2ShgFLAUwMzmANcBVzvndFJQJISMTe3N/35+HLuPnObJlcUszi/h2fWlXDWiL/ddOYgrBsVpwrgD+HUdgO8TO/8NhAMLnHOPmNnDQL5z7mWr21M/p26CtwZ4xDm3yMyigA2+hzkB3O+c2+h7zGpgN/Bx7L/gnHv4YnXoU0AinVP56Ur+uHo3f1i9iyOnKxmVHMvcyYOYkZlEhK4wbjVdCCYiAe9sVQ3Pbyhl/opiig+fJiWuG1+amM7s7BR9n3ErKABEJGjU1jqWbS1j3jtFrN99lNhukdx1xUDumZBGQs+uXpcXdBQAIhKU1u8uZ947RSwtLCMyPIxbxg5gzpWDGNK3h9elBQ0FgIgEteLDp5m/oojn1pdyrrqWa0b2Ze7kwWSn9daEcRMUACLSKRw+de6TCeOjFVWMSenF3MmDuC4zifAwBUFjFAAi0qmcqazhuQ2lzF9RxO4jFQzsE82cSencNi6Fbl3CvS4voCgARKRTqql1LCs8wG/fKeL9PcfoHR3JXePTuHv8QOJ7aMIYFAAi0sk551i/+yi/faeIv28tIzIsjLjuXc7rU3+qoOHJogvNIzRsPv8x7CL3Xfjxz7uv4eNfYJsF92ST2nNwEZ0AAATLSURBVCe60RqbcqEA0AdrRaRTMDOy0uLISovjo0OneGZdCccrqj6539Vbwqz++96Gb4HPv6/BvRfdzjV6X8P32Off5y54X8Mn6BLR9hfEKQBEpNMZnNCD/3P9SK/LCHi6xlpEJEQpAEREQpQCQEQkRCkARERClAJARCREKQBEREKUAkBEJEQpAEREQlRQLQVhZoeo+xrJlogHDrdhOV7qLGPpLOMAjSVQdZaxtHYcA51zCQ0bgyoAWsPM8htbCyMYdZaxdJZxgMYSqDrLWNprHDoFJCISohQAIiIhKpQCYJ7XBbShzjKWzjIO0FgCVWcZS7uMI2TmAERE5HyhdAQgIiL1KABEREJUpwsAM5thZtvMbKeZPdjI/feb2WYz22hmK80sw4s6/dHUWOr1u83MnJkF5Mfd/Ngn95rZId8+2Whmc7yo0x/+7BMzm21mhWZWYGZPd3SN/vJjv/yy3j7ZbmbHvKizKX6MI9XM3jKz983sAzO73os6/eHHWAaa2Ru+cbxtZsmtekLnXKf5AcKBj4BBQBdgE5DRoE9MvduzgL95XXdLx+Lr1xN4B1gDZHlddwv3yb3Ar7yutY3GMhR4H+jt+72v13W35u+rXv+vAwu8rruF+2Qe8GXf7Qxgl9d1t2IszwL3+G5fBfyxNc/Z2Y4AcoCdzrki51wlsAi4qX4H59yJer9259Nf7RkomhyLzw+B/wLOdmRxzeDvOIKBP2O5D3jcOXcUwDl3sINr9Fdz90sesLBDKmsef8bhgBjf7VhgXwfW1xz+jCUDeMN3+61G7m+WzhYAA4CSer+X+trOY2ZfNbOPqHvh/EYH1dZcTY7FzMYCKc65VzqysGbya58At/oOa58zs5SOKa3Z/BnLMGCYma0yszVmNqPDqmsef/cLZjYQSAfe7IC6msufcfwAuNPMSoHXqDuaCUT+jGUTcKvv9s1ATzPr09In7GwBYI20feodvnPucefcYOBfge+3e1Utc9GxmFkY8EvgOx1WUcv4s0/+CqQ550YBfweeaveqWsafsURQdxpoKnXvmuebWa92rqsl/Pq/4pMLPOecq2nHelrKn3HkAb93ziUD1wN/9P3/CTT+jOW7wBQzex+YAuwFqlv6hIH4j9AapUD9d4/JXPxwbxHw2XatqOWaGktP4BLgbTPbBVwBvByAE8FN7hPn3BHn3Dnfr08A4zqotuby5++rFHjJOVflnCsGtlEXCIGmOf9XcgnM0z/g3zi+BCwGcM6tBqKoW1wt0Pjzf2Wfc+4W59xY4Hu+tuMtfkavJz7aeBIlAiii7nD140mUzAZ9hta7fSOQ73XdLR1Lg/5vE5iTwP7sk371bt8MrPG67laMZQbwlO92PHWH9H28rr2lf1/AcGAXvotGA+3Hz33yOnCv7/ZI6l5UA248fo4lHgjz3X4EeLhVz+n1oNvhH/F6YDt1s+nf87U9DMzy3X4UKAA2UjeJcsEXVa9/mhpLg74BGQB+7pMf+fbJJt8+GeF1za0YiwG/AAqBzUCu1zW35u+LuvPnP/a61lbukwxgle/vayMw3euaWzGW24Advj7zga6teT4tBSEiEqI62xyAiIj4SQEgIhKiFAAiIiFKASAiEqIUACIiIUoBICISohQAIiIh6v8Dsnda7uEK+8EAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "x_axis = colsample_bytree_s\n",
    "plt.plot(x_axis, test_means)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "lgbm_params= {'boosting_type': 'goss', 'objective': 'binary', 'is_unbalance': True, 'categorical_feature': [0, 1, 2, 6, 11, 12, 13, 14, 16], 'n_jobs': 4, 'learning_rate': 0.01, 'num_leaves': 40, 'max_depth': 6, 'min_child_samples': 20, 'colsample_bytree': 0.4}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\Anaconda3\\lib\\site-packages\\lightgbm\\basic.py:842: UserWarning: categorical_feature keyword has been found in `params` and will be ignored.\n",
      "Please use categorical_feature argument of the Dataset constructor to pass this parameter.\n",
      "  .format(key))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best n_estimators: 20000\n",
      "best cv score: 0.7235031364656072\n"
     ]
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'categorical_feature': [0,1,2,6,11,12,13,14,16],\n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.01,\n",
    "          #'n_estimators':n_estimators_1,\n",
    "          'num_leaves': 40,\n",
    "          'max_depth': 6,\n",
    "          'min_child_samples':20,\n",
    "          'colsample_bytree': 0.4\n",
    "         }\n",
    "n_estimators_2 = get_n_estimators(params , X_train , y_train, early_stopping_rounds=50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LGBMClassifier(boosting_type='goss',\n",
       "               categorical_feature=[0, 1, 2, 6, 11, 12, 13, 14, 16],\n",
       "               class_weight=None, colsample_bytree=0.4, importance_type='split',\n",
       "               is_unbalance=True, learning_rate=0.01, max_depth=6,\n",
       "               min_child_samples=20, min_child_weight=0.001, min_split_gain=0.0,\n",
       "               n_estimators=100, n_jobs=4, num_leaves=40, objective='binary',\n",
       "               random_state=None, reg_alpha=0.0, reg_lambda=0.0, silent=False,\n",
       "               subsample=1.0, subsample_for_bin=200000, subsample_freq=0)"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'categorical_feature': [0,1,2,6,11,12,13,14,16],\n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.01,\n",
    "          #'n_estimators':n_estimators_1,\n",
    "          'num_leaves': 40,\n",
    "          'max_depth': 6,\n",
    "          'min_child_samples':20,\n",
    "          'colsample_bytree': 0.4\n",
    "         }\n",
    "\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "lg.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pickle\n",
    "\n",
    "pickle.dump(lg, open(\"Music_LightGBM_.pkl\", 'wb'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame({\"columns\":list(feat_names), \"importance\":list(lg.feature_importances_.T)})\n",
    "df = df.sort_values(by=['importance'],ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>columns</th>\n",
       "      <th>importance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>genre_ids</td>\n",
       "      <td>450</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>artist_name</td>\n",
       "      <td>416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>composer</td>\n",
       "      <td>407</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>expiration_date</td>\n",
       "      <td>366</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>lyricist</td>\n",
       "      <td>275</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>source_screen_name</td>\n",
       "      <td>271</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>registration_init_time</td>\n",
       "      <td>264</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>name</td>\n",
       "      <td>259</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>bd</td>\n",
       "      <td>254</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>city</td>\n",
       "      <td>182</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>source_type</td>\n",
       "      <td>177</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>language</td>\n",
       "      <td>176</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>registered_via</td>\n",
       "      <td>149</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>source_system_tab</td>\n",
       "      <td>112</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>song_length</td>\n",
       "      <td>85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>gender</td>\n",
       "      <td>57</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   columns  importance\n",
       "10               genre_ids         450\n",
       "11             artist_name         416\n",
       "12                composer         407\n",
       "8          expiration_date         366\n",
       "13                lyricist         275\n",
       "1       source_screen_name         271\n",
       "7   registration_init_time         264\n",
       "15                    name         259\n",
       "4                       bd         254\n",
       "3                     city         182\n",
       "2              source_type         177\n",
       "14                language         176\n",
       "6           registered_via         149\n",
       "0        source_system_tab         112\n",
       "9              song_length          85\n",
       "5                   gender          57"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.bar(range(len(lg.feature_importances_)), lg.feature_importances_)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
